package org.gzr.myreflect.getfields;

import org.gzr.myreflect.getfields.entity.Student;

import java.lang.reflect.Field;

public class MyFields {
    /**
     * 获取成员变量
     * Field[] getFields()返回所有成员变量对象的数组（只能拿public的）
     * Field[] getDeclaredFields()返回所有成员变量对象的数组，存在就能拿到
     * Field getField(String name)返回单个成员变量对象（只能拿public的）
     * Field getDeclaredField(String name)返回单个成员变量对象，存在就能拿到
     * @param args
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        //获取成员变量

        //1。获取class对象
        Class studentName = Class.forName("org.gzr.myreflect.getfields.entity.Student");

        //2.获取成员变量的对象Fields只能拿public的
        Field[] fields = studentName.getFields();
        for (Field field:fields) {
            System.out.println(field);
        }

        System.out.println("==========");

        //3.获取成员变量的对象（public + private）
        Field[] declaredFields = studentName.getDeclaredFields();
        for (Field field:declaredFields){
            System.out.println(field);
        }

        System.out.println("==========");

        //4.获得单个成员变量对象
        /*Field gender = studentName.getField("gender");
        System.out.println(gender);

        System.out.println("==========");

        //5.获取单个成员变量（私有）
        Field name = studentName.getDeclaredField("name");
        System.out.println(name);*/

        //需求：
        //利用反射获取成员变量并获取值和修改值
        //创建对象
        Student student = new Student();

        Field name = studentName.getDeclaredField("name");
        //临时修改他的访问权限
        name.setAccessible(true);
        //修改name的值
        name.set(student,"zhangsan");
        //获取这个对象name的值
        System.out.println(name.get(student));


    }
}
